/*
 Funciona Perfectamente
 */
package funcionesDeSeleccion;

import elementosEvolutivos.Cromosoma;
import elementosEvolutivos.FuncSeleccion;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import util.Aleatorio;

public class Ranking implements FuncSeleccion{
    
	private double beta;
    
	public Ranking(double b){
        this.beta=b;
    }
    @Override
    public Collection<Cromosoma> seleccionar(Collection<Cromosoma> poblacion, int tam_sel) {
		
    	ArrayList<Cromosoma> pobini = (ArrayList<Cromosoma>)poblacion;
    	Collection<Cromosoma> elegidos = new ArrayList<Cromosoma>();
    	@SuppressWarnings("unchecked")
		ArrayList<Cromosoma> ordenados = (ArrayList<Cromosoma>) pobini.clone();
    	Collections.sort(ordenados);
    	
    	double[] segmentosCalif = calificarPoblacion(ordenados);
        double sumaCalif = segmentosCalif[segmentosCalif.length - 1];
        int numPadres=0;
        while(numPadres<tam_sel){
        	double prob = Aleatorio.getDoubleAleatorio()*sumaCalif;
        		if(prob <= segmentosCalif[0]){
        			elegidos.add(ordenados.get(0).clone());
        			numPadres++;
        		}
        		else{
        			for(int j=1; j<tam_sel; j++)
        				if(prob >segmentosCalif[j-1] && prob<=segmentosCalif[j]){
        					elegidos.add(ordenados.get(j).clone());
                			numPadres++;
        				}
        		}
        			
        }
        return elegidos;

	}
    
	private double[] calificarPoblacion(ArrayList<Cromosoma> pobl) {
		
		double[] calificaciones = new double[pobl.size()];
		int tamPobl = calificaciones.length;
		for(int i=0 ; i<tamPobl; i++){
			double prob = (double)i/tamPobl;
			prob = prob*2*(beta-1);
			prob = beta - prob;
			prob = (double)prob*((double)1/tamPobl);
			if(i!=0)
				calificaciones[i] = calificaciones[i-1] + prob;
			else
				calificaciones[i] = prob;
		}
		return calificaciones;
	}
}





